﻿using Springwater.Business.Util;
using Springwater.DataAccessLayer.Repository;
using Springwater.Model;
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Web.Mvc;

namespace Springwater.Business.ViewModels
{
    public class BorvizEditModel
    {
        [Required]
        public int Id { get; set; }

        [Required]
        [MaxLength(60)]
        public string Elnevezes1 { get; set; }

        [MaxLength(60)]
        public string Elnevezes2 { get; set; }
        
        [MaxLength(60)]
        public string Elnevezes3 { get; set; }

        [Required]
        [MaxLength(20)]
        public string Kod { get; set; }

        [Required]
        [MaxLength(60)]
        public string Tajegyseg { get; set; }

        [Required]
        [MaxLength(60)]
        public string Eredet { get; set; }

        public string Leiras { get; set; }

        public List<Vizgyujto> VizgyujtoList { get; set; }
        public List<int> VizgyujtoIdList { get; set; }
        public List<bool> VizgyujtoBoolList { get; set; }

        [RegularExpression("^[0-9]*o[0-9]*\\.?[0-9]*$")]
        public string GpsNord { get; set; }
        [RegularExpression("^[0-9]*o[0-9]*\\.?[0-9]*$")]
        public string GpsEst { get; set; }
        public string Magassag { get; set; }

        #region Constructor

        public BorvizEditModel()
        {
        }

        public BorvizEditModel(Borviz borviz)
        {
            this.Id = borviz.Id;
            this.Elnevezes1 = borviz.Elnevezes.FirstOrDefault(e => e.Elsodleges).Nev;

            var masodlagosElnevez = borviz.Elnevezes.Where(e => !e.Elsodleges).OrderBy(e => e.Id).ToList();

            if (masodlagosElnevez.Count > 0) this.Elnevezes2 = masodlagosElnevez[0].Nev;
            if (masodlagosElnevez.Count > 1) this.Elnevezes3 = masodlagosElnevez[1].Nev;

            this.Kod = borviz.Kod;
            this.Tajegyseg = borviz.Tajegyseg;
            this.Eredet = borviz.Eredet;
            this.Leiras = borviz.Leiras;

            this.VizgyujtoIdList = borviz.Vizgyujtok.Select(v => v.Id).ToList();

            if (borviz.FoldfelsziniHelyzet != null)
            {
                if (borviz.FoldfelsziniHelyzet.Longitude.HasValue)
                {
                    this.GpsEst = GpsUtil.ConvertDecimalToString(borviz.FoldfelsziniHelyzet.Longitude.Value);
                }

                if (borviz.FoldfelsziniHelyzet.Latitude.HasValue)
                {
                    this.GpsNord = GpsUtil.ConvertDecimalToString(borviz.FoldfelsziniHelyzet.Latitude.Value);
                }

                this.Magassag = borviz.FoldfelsziniHelyzet.Magassag.ToString();
            }           
        }

        #endregion

        public void UpdateBorviz(Borviz borviz, UnitOfWork unitOfWork)
        {
            #region Elnevezes
            
            var elsodlegesNev = borviz.Elnevezes.FirstOrDefault(e => e.Elsodleges);
            elsodlegesNev.Nev = this.Elnevezes1;

            var masodlagosElnevez = borviz.Elnevezes.Where(e => !e.Elsodleges).OrderBy(e => e.Id).ToList();

            if ((masodlagosElnevez.Count > 0 && masodlagosElnevez.Any(e => !e.Nev.Equals(this.Elnevezes2) && !e.Nev.Equals(this.Elnevezes3))) ||
                (!string.IsNullOrEmpty(this.Elnevezes2) && !masodlagosElnevez.Any(e => e.Nev.Equals(this.Elnevezes2))) ||
                (!string.IsNullOrEmpty(this.Elnevezes3) && !masodlagosElnevez.Any(e => e.Nev.Equals(this.Elnevezes3)))
                )
            {
                foreach (var e in masodlagosElnevez)
                {
                    unitOfWork.ElnevezesRepository.Delete(e);
                    borviz.Elnevezes.Remove(e);
                }

                if (!string.IsNullOrEmpty(this.Elnevezes3))
                {
                    borviz.Elnevezes.Add(new Elnevezes() { Nev = this.Elnevezes3, Elsodleges = false });
                }

                if (!string.IsNullOrEmpty(this.Elnevezes2))
                {
                    borviz.Elnevezes.Add(new Elnevezes() { Nev = this.Elnevezes2, Elsodleges = false });
                }
            }

            #endregion

            borviz.Kod = this.Kod;
            borviz.Tajegyseg = this.Tajegyseg;
            borviz.Eredet = this.Eredet;
            borviz.Leiras = this.Leiras;

            #region Vizgyujto

            var vizgyujtoList = unitOfWork.VizgyujtoRepository.Get(orderBy: q => q.OrderBy(d => d.Nev)).ToList();

            for (int i = 0; i < this.VizgyujtoBoolList.Count; i++)
            {
                if (this.VizgyujtoBoolList[i])
                {
                    if (!borviz.Vizgyujtok.Any(v => v.Id == vizgyujtoList[i].Id))
                    {
                        borviz.Vizgyujtok.Add(vizgyujtoList[i]);
                    }
                }
                else
                {
                    if (borviz.Vizgyujtok.Any(v => v.Id == vizgyujtoList[i].Id))
                    {
                        borviz.Vizgyujtok.Remove(vizgyujtoList[i]);
                    }
                }
            }

            #endregion

            #region FoldfelsziniHelyzet

            if (!string.IsNullOrEmpty(this.GpsNord))
            {
                if (borviz.FoldfelsziniHelyzet == null) borviz.FoldfelsziniHelyzet = new FoldfelsziniHelyzet();
                borviz.FoldfelsziniHelyzet.Latitude = GpsUtil.StringToDD(this.GpsNord);
            }

            if (!string.IsNullOrEmpty(this.GpsEst))
            {
                if (borviz.FoldfelsziniHelyzet == null) borviz.FoldfelsziniHelyzet = new FoldfelsziniHelyzet();
                borviz.FoldfelsziniHelyzet.Longitude = GpsUtil.StringToDD(this.GpsEst);
            }

            if (!string.IsNullOrEmpty(this.Magassag))
            {
                if (borviz.FoldfelsziniHelyzet == null) borviz.FoldfelsziniHelyzet = new FoldfelsziniHelyzet();
                borviz.FoldfelsziniHelyzet.Magassag = short.Parse(this.Magassag);
            }

            #endregion
        }

        public void Validate(ModelStateDictionary modelState, UnitOfWork unitOfWork)
        {
            if (!modelState.IsValid) return;

            if (unitOfWork.BorvizRepository.Get(b => b.Kod.Equals(this.Kod) && b.Id != this.Id).FirstOrDefault() != null)
            {
                modelState.AddModelError("Kod", "Ez a kod mar letezik!");
            }
        }

        public void Init(UnitOfWork unitOfWork)
        {
            this.VizgyujtoList = unitOfWork.VizgyujtoRepository.Get(orderBy: q => q.OrderBy(d => d.Nev)).ToList();

            if (this.VizgyujtoBoolList != null)
            {
                this.VizgyujtoIdList = new List<int>();

                for (int i = 0; i < this.VizgyujtoBoolList.Count; i++)
                {
                    if (this.VizgyujtoBoolList[i]) this.VizgyujtoIdList.Add(this.VizgyujtoList[i].Id);
                }
            }
        }
    }
}
